package com.atguigu.springmvc.controller;

import com.atguigu.springmvc.bean.Person;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;

@RestController
public class RequestTestController {
    // 请求参数：
    // 要求：变量名和参数名保持一致
    //  1、没有携带：包装类型自动封装为null，基本类型封装为默认值
    //  2、携带：自动封装
    @RequestMapping("/handle01")
    public String handlerParams(String username,
                                String password,
                                String cellphone,
                                boolean agreement) {
        System.out.println(username);
        System.out.println(password);
        System.out.println(cellphone);
        System.out.println(agreement);
        return "success";
    }

    // 无论请求参数带到了 请求体中还是 url? 后面，他们都是请求参数。都可以直接用@RequestParam或者同一个变量名获取到
    @RequestMapping("/handle02")
    public String handlerAnnoParams(@RequestParam("username") String name,
                                    @RequestParam(value = "password", defaultValue = "123456") String pwd,
                                    @RequestParam("cellphone") String phone,
                                    @RequestParam(value = "agreement", required = false) boolean ok) {
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(phone);
        System.out.println(ok);
        return "known";
    }

    // 如果目标方法参数是一个 pojo；SpringMVC 会自动把请求参数 和 pojo 属性进行匹配
    // pojo的所有属性值都是来自于请求参数
    // 如果请求参数没带，封装为null
    // 实际测试下来，每个属性都是null,不知道为什么！！！！(测了快一天,找到问题在pom文件上,build标签里plugins里有两个lombok的plugin)
    @RequestMapping("/handle03")
    public String handlerPojo(Person person) {
        // 为什么person的所有属性为null
        System.out.println(person);

        return "I know";
    }

    // 获取请求头信息
    @RequestMapping("/handle04")
    public String handleHeader(@RequestHeader("user-agent") String userAgent) {
        System.out.println("user-agent: " + userAgent);
        return "I know";
    }

    // 获取cookie值
    @RequestMapping("/handle05")
    public String handleCookie(@CookieValue("Luo") String value) {
        System.out.println("Luo: " + value);
        return "I know";
    }

    // 使用pojo级联封装复杂属性
    @RequestMapping("/handle06")
    public String handleComplexPojo(Person person) {
        System.out.println(person);
        return "I know";
    }

    // @RequestBody: 获取请求体json数据，自动转为person对象
    // 测试接受json数据
    // 发出：请求体中是json字符串，不是k=v
    // 接受：@RequestBody Person person
    // @RequestBody Person person
    //      拿到请求体中的json字符串
    //      把json字符串转为person对象
    @RequestMapping("/handle07")
    public String handleJson(@RequestBody Person person) {
//    public String handleJson(@RequestBody String person) throws JsonProcessingException {
        System.out.println(person);
//        ObjectMapper mapper = new ObjectMapper();
//        Person person1 = mapper.readValue(person, Person.class);
//        System.out.println(person1);
        return "ok";
    }

    // 文件上传
    // @RequestParam 取出文件项，封装为MultipartFile，就可以拿到文件内容
    @RequestMapping("/handle08")
    public String handlePersonAndFiles(Person person,
                                       @RequestParam("headerImg") MultipartFile headFile,
                                       @RequestParam("lifeImg") MultipartFile[] lifeFiles) throws IOException {
        System.out.println(person);
        String originalFilename = headFile.getOriginalFilename();
        // 默认上传文件大小有限制在1M以下，如需要得在application.properties里调整大小
        long fileSize = headFile.getSize();
        InputStream is = headFile.getInputStream();
        headFile.transferTo(new File("D:\\imgs\\" + originalFilename));

        for (MultipartFile lifeFile : lifeFiles) {
            String originalFilename1 = lifeFile.getOriginalFilename();
            lifeFile.transferTo(new File("D:\\imgs\\" + originalFilename1));
        }

        return "I know";
    }

    // HttpEntity：封装请求头、请求体； 把整个请求拿过来
    //      泛型：<String>：请求体类型； 可以自动转化
    @RequestMapping("/handle09")
    public String handleEntity(HttpEntity<Person> entity) throws IOException {
        System.out.println(entity.getHeaders());
        System.out.println(entity.getBody());
        return "I know";
    }

    // 接受原生 API
    @RequestMapping("/handle10")
    public void handle10(HttpServletRequest request,
                         HttpServletResponse response,
                         HttpMethod method) throws IOException {
        System.out.println("请求方式："+method);
        String username = request.getParameter("username");
        System.out.println(username);
        response.getWriter().write("ok!!!"+username);
    }
}
